"""
日志管理模块

提供灵活的日志记录功能，支持文件大小轮转和时间轮转，
同时输出到控制台和日志文件，便于调试和问题排查。
"""

import logging
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
from config.config import cm


class Log:
    """日志记录器类
    
    支持按大小或时间分割日志文件，
    同时输出到控制台和文件系统
    """
    
    def __init__(self, seg):
        """
        初始化日志记录器
        :param seg: 日志分割方式，'size'按大小分割，'time'按时间分割
        """
        self.seg = seg

        # 创建logger
        self.logger = logging.getLogger()
        if not self.logger.handlers:
            self.logger.setLevel(logging.DEBUG)

            # 定义日志文件大小为10M
            max_bytes = 10 * 1024 * 1024
            # 定义保留的文件数量为50个
            backup_count = 50

            # 创建日志文件处理器
            if self.seg == "time":
                # 按时间轮转
                fh = TimedRotatingFileHandler(
                    cm.log_file, 
                    when='D', 
                    backupCount=backup_count, 
                    encoding='utf-8'
                )
                fh.setLevel(logging.INFO)
            else:
                # 按大小轮转
                fh = RotatingFileHandler(
                    cm.log_file, 
                    maxBytes=max_bytes, 
                    backupCount=backup_count, 
                    encoding='utf-8'
                )
                fh.setLevel(logging.INFO)

            # 创建控制台输出处理器
            ch = logging.StreamHandler()
            ch.setLevel(logging.INFO)

            # 定义输出格式
            formatter = logging.Formatter(self.fmt)
            fh.setFormatter(formatter)
            ch.setFormatter(formatter)

            # 添加处理器到logger
            self.logger.addHandler(fh)
            self.logger.addHandler(ch)

    @property
    def fmt(self):
        """日志格式字符串"""
        return '%(levelname)s\t%(asctime)s\t[%(filename)s:%(lineno)d]\t%(message)s'


# 默认使用大小分割的日志记录器
log = Log('size').logger
